策略模式

策略模式

使用继承可以实现代码的复用,比如提取子类中共同的行为。

1
2
3
4
5
6
7
8
class Ducker{
fly();
bark();
swim();
}

class MallardDuck extends Ducker{};
class RedheadDuck extends Ducker{};

有一个问题是,fly的行为可能因“类”而异。譬如唐老鸭就不会飞。怎么解决?

设计原则:把易变的部分抽取出来,与不变的部分独立开。

使用接口来抽象易变的代码怎么样?

1
2
3
4
5
6
7
8
9
10
interface Flyable(){
fly();
}

class MallardDuck extends Ducker implements Flyable{
fly(..);
};
class RedheadDuck extends Ducker implements Flyable{
fly(..);
};

这样处理的问题是,每一个子类都要实现接口,无法复用!怎么解决?

给飞行的行为提供具体的实现类:

1
2
3
4
5
6
class FlyWithWings implements Flyable{
fly(..);
}
class FlyNoWay implements Flyable{
fly(..);
}

让鸭子的子类自己去选择飞行的方式(委托给行为类):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Ducker{
Flyable flyable;

fly(){ flyable.fly; };
bark();
swim();
}

class MallardDuck extends Ducker{
MallardDuck(){
flyable = new FlyWithWings();
}
};
class RedheadDuck extends Ducker{
RedheadDuck(){
flyable = new FlyNoWay();
}
};

可以发现,使用组合来实现复用的。
组合是一个“has-a”的关系。
继承是一个“is-a”的关系。

设计原则:多用组合,少用继承。

行为可以理解成不同的算法,把算法提取出来,与让对象自由的选择。这就是策略模式。

设计原则:面向接口编程

设计模式是一种思想,让代码看起来更加清晰,维护起来更加容易。

本文标题:策略模式

文章作者:Sun

发布时间:2018年12月17日 - 15:12

最后更新:2018年12月19日 - 20:12

原始链接:https://sunyi720.github.io/2018/12/17/Design Patterns/设计模式入门/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。